#include "golbal.h"
#include "MsgUtil.h"
#include <pthread.h>
#include <stdio.h>
#include <glib.h>
#include "SendConfig.h"
#include "HeartRequest.h"
// 存储ip和sn的变量
gchar *gatewayIp='\0';
gchar *sn=NULL;

/*
    1.boa还没有配置，心跳进程先去获取，获取不到 -正常
    2.boa已经配置过了，读取数据一直存储在内存中了【万一配置错误】，ip地址后面发生过更改的情况

*/

//获取ip
gchar *getGatewayIp()
{
    // 如果已经有了就直接返回
    if (gatewayIp!= NULL)
    {
        return gatewayIp;
    }
    //正常的去文件里面读取
    //把数据存储到文件中：glib
    GKeyFile *keyFile= g_key_file_new();
    //加载文件读取配置文件存储位置
    if(!g_key_file_load_from_file(keyFile,"./config.ini",G_KEY_FILE_NONE,NULL)){
        g_warning("load config.ini error!");
        //return -1;

    }
    //读取里面的路径
    gchar *path = g_key_file_get_string(keyFile,"config","devinfo_path",NULL);

    GKeyFile *devFile= g_key_file_new();
    //判断是否有这个配置文件
    if (!g_file_test(path, G_FILE_TEST_EXISTS)) {
        return gatewayIp;
    } 
    //如果有就打开这个配置文件
    if(!g_key_file_load_from_file(devFile,path,G_KEY_FILE_NONE,NULL)){
        g_warning("load config.ini error!");
        return gatewayIp;

    }
    gatewayIp= g_key_file_get_string(devFile,"config","gatewayIp",NULL);  
   
    g_key_file_free(devFile);
    g_key_file_free(keyFile);

    return gatewayIp;
}

// 获取sn
gchar getSn()
{
    // 如果已经有了就直接返回
    if (sn != NULL)
    {
        printf("从缓存中获取到sn了\n");
        return sn;
    }
    // 打开文件,这是正确的代码，但是在虚拟机上会出问题
    // FILE* file =  fopen("/sys/class/dmi/id/product_serial","r");
    // 给sn分配空间
    // sn = (gchar *)calloc(1,128);
    // 读取一行数据到sn
    // fgets(sn,128,file);
    sn = "jjjjjjjjj";//自己编一个
    //g_print("sn=%s\n", sn);
    return sn;
}
void *recvConfigMsg(void *param)
{
    while (1)
    {
        // 1.通过进程通讯 通知 另外一个心跳进程--可以去向服务器注册广告机
        // 获取mqId
        int mqId = getMsgQueue(PATHNAME_BOA_MAIN, PROCESS_ID_BOA_MAIN);

        Message msg = {
            .type = 1};
        printf("start recv msg \n");
        int ret = recvMsg(mqId, &msg, MSG_SIZE); // 0,第一个类型，0表示阻塞等待
        if (ret == -1)
        {
            perror("recive msg error: ");
        }

        printf("type is %ld,msg is %s\n", msg.type, msg.text);
        // 触发发送消息到网关代码
        //发送请求的代码 ---sn  地址 http://47.109.65.208/config.json
        sendConfigRequest(sn);
        printf("aaa");
    }
}

int main(int argc, char const *argv[])
{
    // 1.接收boa进程发送消息
    // 新开一个线程去接收消息 ---发送请求到网关
    pthread_t pid;
    pthread_create(&pid, NULL, recvConfigMsg, NULL);

    //2.发送心跳请求 每过5分钟发送一次请求
    while (1)
    {
        //调用发送心跳请求的代码
        sleep(5);
        gchar * ipTemp =  getGatewayIp();
        printf("ip value: %s\n",ipTemp);
        if (ipTemp==NULL)
        {
           continue;
        }        
        //发送心跳请求
        printf("aaaa");
        sendHeartRequest(ipTemp,getSn());
        
        //调用发送心跳请求的代码
        //sleep(5);

    }
    return 0;
}
